iT邦幫忙

0

Day 11, Data Structure- Coursera- Fibonacci

  • 分享至 

  • xImage
  •  

費波那契數

一個偽理科人最喜歡說的詞語,只要說出這一詞,頓時能成為全場話題終結者沒有之一,一個跟費波那契回調聽起來一樣但其實不一樣的事物,一個是跟兔子生育數有關(很會生),一個是跟網路股票知名聽牌名人分析時的話術,甚麼黃金比例預測股票上揚,我每天多吃一份雞腿便當體重會逐年上升還比較準。好了,為甚麼我今天會提這個呢?
因為,我今天上coursera的課程開始感到時間停滯(這往往不是好現象),主講者秀出了不同版本的費波那契數公式,但卻感覺在拖時間,因為他一直強調演算法的重要性,然而卻不解釋任一其中費波納契數在幹嘛,為了讓我能找回學習的動力,我決定自己打一份費波納契數的程式。
費波納契數公式:
F0=0
F1=1
Fn=Fn-1+Fn-2(n≧2)
將公式帶入執行,結果呈列出來我們會看見:
0、1、 1、 2、 3、 5、 8、 13、 21、 34、 55、 89、 144、 233、 377、 610、 987......
正如Fn=Fn-1+Fn-2(n≧2)一樣,下一筆數值是前兩項數值的加總,而這是大自然中常見的黃金比例,例如貝殼。
https://ithelp.ithome.com.tw/upload/images/20220614/20149573414aha1oYC.jpg

至於如何呈現出能快速計算出費波納契數的程式,靠的是觀察和一點小巧思(你也可以說小聰明,我不介意),這題就如同Day 10的問題,也許能宣告vector進行計算,然而隨著迴圈地進行還一直呼叫之前的index(ex: f[n-1]),會導致計算時間過長,如果有stress test就會得到time limit的結果,所以呢,我們要突破盲腸,放棄vector(誤),以下是我的程式,仔細觀察,就會知道我做了甚麼:

//費波納契數
#include<iostream>
using namespace std;
int main(){
	while(true){
		long long a=0,b=1,c=0;
		int n;
		cin>>n;
		if(n==0){
			cout<<"F"<<n<<" is "<<a<<endl;
			}
		else if(n==1){
			cout<<"F"<<n<<" is "<<b<<endl;
		}
		else{
			for(int i=0;i<n-1;i++){
				c=a+b;//悄悄替換了一些東西
				a=b;//將b值給a
				b=c;//將c 值給b,想想我在幹嘛
				}
			cout<<"F"<<n<<" is "<<c<<endl;
			}
	}

		return 0;		
	}

雖然維基百科似乎有更簡潔優美的範例程式,但我認為自己的產出也挺不錯的(沒錯,就是沒根據得自賣自誇)。

最後,當主講者強調費波納契數n值越大,越能感受到前值相加後龐大數能力時,我默默輸入數值與他背後的範例比對
https://ithelp.ithome.com.tw/upload/images/20220614/20149573CKAlm3Aixb.png
https://ithelp.ithome.com.tw/upload/images/20220614/20149573eVfrgOTLSo.png
恩,完全正確了呢! I did it!


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言